package 斗地主_控制台版;

import java.util.*;

public class PokerGame3 {
    //创建集合(牌盒)
    static ArrayList<String> list=new ArrayList<>();
    //创建一个map集合用来存储牌的价值
    static HashMap<String,Integer> map=new HashMap<>();

    //使用静态代码块加载牌,
    //静态代码块特点:顺着类的加载而加载,只执行一次
    static{
        //创建两个集合用于存储号码和花色,进行遍历拼接到集合中
        String [] color={"♥","♣","♦","♠"};
        String [] number={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};

        //遍历数组
        for (String s : color) {
            //s表示每一个花色
            for (String s1 : number) {
                //s1表示号码
                //进行拼接
                list.add(s+s1);
            }
        }
        //注意细节:空格为了使o1.substring(0, 1);发挥作用
        list.add(" 大王");
        list.add(" 小王");
        //添加牌的价值
        map.put("J",11);
        map.put("Q",12);
        map.put("K",13);
        map.put("A",14);
        map.put("2",15);
        map.put("小王",16);
        map.put("大王",17);
    }

    public PokerGame3() {
        Collections.shuffle(list);
        //发牌
        /*创建集合用来发牌打牌3r＋底牌=4个集合对象*/
        ArrayList<String> daPai1=new ArrayList<>();
        ArrayList<String> daPai2=new ArrayList<>();
        ArrayList<String> daPai3=new ArrayList<>();
        ArrayList<String> underCard=new ArrayList<>();
        //遍历牌盒/发个每一个人
        for (int i = 0; i < list.size(); i++) {
            //i表示索引,普通for可以更好计算牌应该发个谁
            String poker = list.get(i);
            if (i<3){
                underCard.add(poker);
                continue;
            }
            if (i%3==0){
                daPai1.add(poker);
            }else if (i%3==1){
                daPai2.add(poker);
            }else {
                daPai3.add(poker);
            }
        }
        order(underCard);
        order(daPai1);
        order(daPai2);
        order(daPai3);
        addPoker("地主",underCard);
        addPoker("张三",daPai1);
        addPoker("李四",daPai2);
        addPoker("王五",daPai3);
}

    /**
     * 利用牌的价值进行排序
     * @param list
     * 牌的集合
     */
    public static void order(ArrayList<String> list){
        //排序
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                /**
                 * o1:表示当前要插入到有序序列的牌
                 * o2:表示已经在有序序列中存在的牌
                 *
                 * 结果:o1小就插入到前面
                 *      o1大就插入到后面
                 * 返回0:o1数字跟o2数字一样大,在根据花色来再次排序
                 */
                //计算o1的花色和价值
                //substring()截取:参数一表示起始,参数二表示个数
                String color1 = o1.substring(0, 1);
                int value1 = getValue(o1);
                //计算o2的价值:
                String color2 = o2.substring(0, 1);
                int value2 = getValue(o2);
                //进行判断o1和o2
                int i = value1 - value2;
                return i==0?color1.compareTo(color2):i;
            }
        });
    }

    /**
     * 计算牌的价值
     * @param poker
     * 牌
     * @return
     * 在map集合中所对应的价值
     */
    public static int getValue(String poker){
        //获取牌上的数组
        String number = poker.substring(1);
        //判断number在map集合中是否存在:
        // 存在就拿出map集合中对应的价值
        // 不存在就是自身是价值,直接做类型转换
        if (map.containsKey(number)){
            return map.get(number);
        }else {
            return Integer.parseInt(number);
        }
    }
    public static void addPoker(String name,ArrayList<String> list){
        System.out.print(name+"的牌:");
        for (String s : list) {
            System.out.print(s+" ");
        }
        System.out.println();
    }
}
